package thread.demo03.ThreadLocal;

import java.util.ArrayList;
import java.util.List;

public class ThreadLocalDemo {

	/**
	 * 类ThreadLocal主要解决的就是每个线程绑定自己的值
	 */
	public static ThreadLocal<List<String>> threadLocal = new ThreadLocal<>();

	public void setThreadLocal(List<String> values) {
		threadLocal.set(values);
	}

	public void getThreadLocal() {
		System.out.println(Thread.currentThread().getName());
		// lambda表达式
		threadLocal.get().forEach(name -> System.out.println(name));
	}

	public static void main(String[] args) throws InterruptedException {

		final ThreadLocalDemo threadLocal = new ThreadLocalDemo();

		// 线程1
		new Thread(new Runnable() {

			@Override
			public void run() {
				List<String> params = new ArrayList<>(3);
				params.add("张三");
				params.add("李四");
				params.add("王五");
				threadLocal.setThreadLocal(params);
				threadLocal.getThreadLocal();
			}
		}).start();

		// 线程2
		new Thread(() -> {
			try {
				Thread.sleep(1000);
				List<String> params = new ArrayList<>(2);
				params.add("Chinese");
				params.add("English");
				threadLocal.setThreadLocal(params);
				threadLocal.getThreadLocal();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}).start();
	}

	/**
	 * 可以看出虽然多个线程对同一个变量进行访问，但是由于threadLocal变量由ThreadLocal修饰，则不同的线程访问的就是该线程设置的值，这里也就体现出来ThreadLocal的作用。
	 */

	/**
	 * 当使用ThreadLocal维护变量时，ThreadLocal为每个使用该变量的线程提供独立的变量副本，所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
	 */

	/**
	 * ThreadLocal是线程局部变量，是一种多线程间并发访问变量的解决方案。和synchronized等加锁的方式不同，ThreadLocal完全不提供锁，而使用以空间换时间的方式，为每个线程提供变量的独立副本，以保证线程的安全。
	 */
}